package com.ledim.service;

import com.ledim.bean.ChannelFilterHeadBean;
import com.ledim.bean.ChatRoomBean;
import com.ledim.bean.ChatRoomShareData;
import com.ledim.bean.CoinDetailBean;
import com.ledim.bean.ContributeListBean;
import com.ledim.bean.ExpressionPackageBean;
import com.ledim.bean.FanDataBean;
import com.ledim.bean.FocusDataBean;
import com.ledim.bean.LaunchImageUrlBean;
import com.ledim.bean.LedimAlbumBean;
import com.ledim.bean.LedimChoiceCardBean;
import com.ledim.bean.LedimGroupsCardReponse;
import com.ledim.bean.LedimPlayCountBean;
import com.ledim.bean.LedimPushBean;
import com.ledim.bean.LedimRoomStatus;
import com.ledim.bean.LedimSearchSuggestion;
import com.ledim.bean.LedimUserBean;
import com.ledim.bean.LedimVedioTagBean;
import com.ledim.bean.LedimWatchUserResponse;
import com.ledim.bean.LoginResponseBean;
import com.ledim.bean.RoomAddPlayListResponse;
import com.ledim.bean.RoomInfoResponse;
import com.ledim.bean.RoomListResponse;
import com.ledim.bean.RoomNoticeBean;
import com.ledim.bean.RoomPlayVideoBean;
import com.ledim.bean.RoomPlaylistResponse;
import com.ledim.bean.SearchResultResponse;
import com.ledim.bean.SubmediaEpisodesResponse;
import com.ledim.bean.TagChannelListDataResponse;
import com.ledim.bean.UploadRoomNoticeBean;
import com.ledim.bean.UserSignDataBean;
import com.ledim.bean.WeixinResponse;
import com.ledim.bean.base.BaseListResponse;
import com.ledim.bean.base.BaseResultDataInfo;
import com.ledim.bean.base.BaseResultInfo;
import java.util.Map;
import okhttp3.RequestBody;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;

/**
 * Created by ccx on 16/5/16.
 */
public interface ApiService {

    /***********************************************************************************************
     ************************************    ROOM    ***********************************************
     * ********************************************************************************************/

    /**
     * @param room
     *         房间id
     * @param title
     *         主题
     * @param photo
     *         图片
     * @return
     */
    @Multipart
    @POST("/rooms/{room}/share")
    Observable<BaseResultDataInfo<ChatRoomShareData>> getRoomShareUrl(@Path("room") String room,
                                                                      @Part("title")
                                                                      RequestBody title,
                                                                      @Part("screenshot\"; filename=\"screenshot.jpg")
                                                                      RequestBody photo);
    //@GET(" ")
    //Observable<String> getData();
    //
    //@GET("newhouse/apisearch")
    //Observable<HouseResponse> getNewhouseList(@Query("city_id") String city_id,
    //                                          @Query("limit_offset") int limit_offset,
    //                                          @Query("limit_count") int limit_count
    //
    //);

    /**
     * @param sort
     * @param page
     * @param per_page
     * @return 获取首页放映厅列表
     */
    @GET("/rooms")
    Observable<RoomListResponse> getLedimRooms(@Query("sort") int sort, @Query("page") int page,
                                               @Query("per_page") int per_page);

    /**
     * @param roomId
     * @return 获取指定放映厅的信息
     */
    @GET("/rooms/{id}")
    Observable<RoomInfoResponse> getLedimRoomInfo(@Path("id") String roomId);

    /**
     * @return 获取我的放映厅的信息
     */
    @GET("/rooms/me")
    Observable<RoomInfoResponse> getMyRoomInfo();

    /**
     * 通过id查找用户信息 用于用户个人中心
     *
     * @param roomId
     * @param uid
     * @return
     */
    @GET("/rooms/{id}/chat/user/status")
    Observable<BaseResultDataInfo<LedimUserBean>> getRoomUserInfo(@Path("id") String roomId,
                                                                  @Query("uid") String uid);

    /**
     * @return 获取我的聊天室图片Url地址列表最多5条
     */
    @POST("/rooms/getCover")
    @FormUrlEncoded
    Observable<BaseListResponse<String>> getMyRoomPicUrls(@Field("ids") String ids);

    /**
     * @param id
     *         用户id
     * @param cover
     * @return 设置聊天室的背景图，通过url地址
     */
    @POST("rooms/{id}/coverFromMeizi")
    @FormUrlEncoded
    Observable<BaseResultInfo> setMyRoomPic(@Path("id") String id, @Field("cover") String cover);

    /**
     * @param room
     * @param photo
     * @return 上传语音公告文件
     */
    @Multipart
    @POST("/rooms/{userid}/announce")
    Observable<BaseResultDataInfo<UploadRoomNoticeBean>> uploadRecordRoomNotice(
            @Path("userid") String room, @Part("announcement\"; " +
                                                       "filename=\"announcement" +
                                                       ".mp3") RequestBody photo,
            @Part("type") RequestBody type);

    /**
     * @param room
     * @param photo
     * @return 上传文字公告公告文件
     */
    @Multipart
    @POST("/rooms/{userid}/announce")
    Observable<BaseResultDataInfo<UploadRoomNoticeBean>> uploadTextRoomNotice(
            @Path("userid") String room, @Part("announcement") RequestBody photo,
            @Part("type") RequestBody type);

    @GET("/rooms/{id}/announce")
    Observable<BaseResultDataInfo<RoomNoticeBean>> getRoomNotice(@Path("id") String roomId);


    /**
     * 修改放映厅播放列表排序---PUT请求
     */
    @FormUrlEncoded
    @PUT("/rooms/{roomid}/playlist/sort")
    Observable<BaseListResponse<RoomPlayVideoBean>> modifyRoomPlaylistSort(
            @Path("roomid") String roomid, @Field("order") String order);


    /**
     * 退出语C放映厅
     *
     * @param roomId
     * @return
     */
    @GET("/rooms/quit/{id}")
    Observable<BaseResultInfo> quiteWucRoom(@Path("id") String roomId);

    /**
     * 开启聊天室机器人
     *
     * @param roomId
     * @return
     */
    @PUT("/rooms/{id}/robot")
    Observable<BaseResultInfo> startRoomRobot(@Path("id") String roomId);

    /**
     * @param roomId
     * @param message
     * @param vtkey
     * @param ext
     * @return 发送聊天室消息 包括发送金币
     */
    @FormUrlEncoded
    @POST("/rooms/{id}/chat/message")
    Observable<BaseResultDataInfo<ChatRoomBean>> sendRoomMsg(@Path("id") String roomId,
                                                             @Field("message") String message,
                                                             @Field("vtkey") String vtkey,
                                                             @Field("ext") String ext);

    /**
     * @param roomId
     * @return 获取放映厅状态
     */
    @GET("/rooms/{id}/status")
    Observable<BaseResultDataInfo<LedimRoomStatus>> getRoomStatus(@Path("id") String roomId);

    /**
     * @param roomId
     * @return 获取放映厅播放列表
     */
    @GET("/rooms/{id}/playlist")
    Observable<RoomPlaylistResponse> getRoomPlayList(@Path("id") String roomId);

    /**
     * @param roomId
     * @param playlists
     * @return 删除放映厅播放列表
     */
    @DELETE("/rooms/{id}/playlist")
    Observable<BaseListResponse<RoomPlayVideoBean>> deleteRoomPlayList(@Path("id") String roomId,
                                                                       @Query("playlists")
                                                                       String playlists);

    /**
     * @param roomId
     * @param media
     * @param submedias
     * @return 添加放映厅播放列表
     */
    @FormUrlEncoded
    @POST("/rooms/{id}/playlist")
    Observable<RoomAddPlayListResponse> addRoomPlayList(@Path("id") String roomId,
                                                        @Field("media") String media,
                                                        @Field("submedias") String submedias);

    /**
     * @param roomId
     * @param status
     *         1： 开启 0： 关闭
     * @return 修改放映厅状态
     */
    @FormUrlEncoded
    @PUT("/rooms/{id}/status")
    Observable<BaseResultDataInfo<ChatRoomBean>> modifyRoomStatus(@Path("id") String roomId,
                                                                  @Field("status") String status);
    /**
     * @param roomId
     * @param file
     * @return 修改Room封面
     */
    @Multipart
    @POST("/rooms/{id}/cover")
    Observable<BaseResultDataInfo<ChatRoomBean>> modifyRoomCover(@Path("id") String roomId,
                                                                 @Part("cover\"; " +
                                                                               "filename=\"cover" +
                                                                               ".jpg")
                                                                 RequestBody file);
    
    /**
     * @param roomId
     * @param name
     * @param info
     * @return 修改聊天室信息
     */
    @FormUrlEncoded
    @PUT("/rooms/{id}")
    Observable<BaseResultDataInfo<ChatRoomBean>> modifyRoomInfo(@Path("id") String roomId,
                                                                @Field("name") String name,
                                                                @Field("intro") String info);

    /**
     * @param roomId
     * @param uid
     * @param action  1, 禁言 2, 踢出 3, 解除禁言 4, 解除踢出
     * @return
     */
    @FormUrlEncoded
    @POST("/rooms/{id}/chatForbid")
    Observable<BaseResultInfo> modifyUserChatState(@Path("id") String roomId,
                                                   @Field("uid") String uid,
                                                   @Field("action") int action);

    /***********************************************************************************************
     ************************************    CHANNEL  TAG  SEARCH  FOCUS   *************************
     **********************************************************************************************/

    /**
     * 取消关注接口
     *
     * @param uid
     * @return
     */
    @GET("/follow/cancel/{uid}")
    Observable<BaseResultDataInfo<FocusDataBean>> cancleFollow(@Path("uid") String uid);

    /**
     * 关注接口
     *
     * @param uid
     * @return
     */
    @GET("/follow/focus/{uid}")
    Observable<BaseResultDataInfo<FocusDataBean>> followFocus(@Path("uid") String uid);

    /**
     * 获取头部数据
     */
    @GET("/channels/{id}/filters")
    Observable<BaseResultDataInfo<ChannelFilterHeadBean>> getHeadData(@Path("id") String id);

    /**
     * 获取频道页list数据
     * channel  频道id
     * sr  排序
     * st  属性
     * vt  类型
     * ag  年龄
     * sp  艺人
     * sc  类型
     * ar 地区
     * yr 年份
     *
     * @return 返回的数据和标签页一样
     * sr, st, vt, ag, sp, sc, ar, yr, opposite
     */
    @GET("/channels/{channelsId}")
    Observable<TagChannelListDataResponse> getChannelListData(@Path("channelsId") String channelsId,
                                                              @Query("page") int page,
                                                              @Query("per_page") int per_page,
                                                              @QueryMap
                                                              Map<String, String> options);



    /**
     * @param q
     * @return 获取搜索的sug信息
     */
    @GET("/search/suggested")
    Observable<BaseListResponse<LedimSearchSuggestion>> getSearchSuggestion(@Query("q") String q);

    /**
     * @param q
     * @return 获取搜索结果
     */
    @GET("/search")
    Observable<SearchResultResponse> getSearchResultList(@Query("channel_id") String channel_id,
                                                         @Query("q") String q,
                                                         @Query("page") int page,
                                                         @Query("per_page") int per_page,
                                                         @Query("type") int type);

    /**
     * 标签点赞
     *
     * @param id
     * @return
     */
    @PUT("/tags/{id}/like")
    Observable<BaseResultDataInfo<LedimVedioTagBean>> likeTag(@Path("id") String id);

    /**
     * 获取标签也list数据
     *
     * @param id
     * @return
     */
    @GET("/tags/{id}/tags")
    Observable<TagChannelListDataResponse> getLabelFiltersList(@Path("id") String id,
                                                               @Query("page") int page,
                                                               @Query("per_page") int per_page,
                                                               @Query("order") int order,
                                                               @Query("st") int st);

    /***********************************************************************************************
     ************************************    MEDIA   ***********************************************
     * ********************************************************************************************/


    /**
     * 获取媒资的图文，数字剧集列表
     *
     * @param media
     * @param submedia
     * @param type
     *         选填 1全部  2正片 3非正片  默认是全部
     * @param desc
     *         选填 排序 0升序 1降序
     * @param per_page
     * @param page
     * @return
     */
    @GET("/medias/{media}/{submedia}/episodes")
    Observable<SubmediaEpisodesResponse> getMediaLists(@Path("media") String media,
                                                       @Path("submedia") String submedia,
                                                       @Query("type") String type,
                                                       @Query("desc") int desc,
                                                       @Query("per_page") int per_page,
                                                       @Query("page") String page);
    /**
     * 获取媒资详情
     *
     * @param path
     * @return
     */
    @GET("/medias/{path}")
    Observable<BaseResultDataInfo<LedimAlbumBean>> getMediaDetail(@Path("path") String path);

    /**
     * 获取播放次数
     *
     * @param mediaid
     * @param submediaid
     * @param media
     * @param submedia
     * @return
     */
    @GET("/medias/{mediaid}/{submediaid}/counts?")
    Observable<BaseResultDataInfo<LedimPlayCountBean>> getPlayCounts(
            @Path("mediaid") String mediaid, @Path("submediaid") String submediaid,
            @Query("media") String media, @Query("submedia") String submedia);

    /**
     * 获取tag列表数据
     *
     * @param id
     * @return
     */
    @GET("medias/{id}/tags")
    Observable<BaseListResponse<LedimVedioTagBean>> getTagsList(@Path("id") String id);

    /**
     * 创建标签
     *
     * @param id
     * @param title
     * @param type
     * @return
     */
    @POST("medias/{id}/tags")
    @FormUrlEncoded
    Observable<BaseResultDataInfo<LedimVedioTagBean>> createTag(@Path("id") String id,
                                                                @Field("title") String title,
                                                                @Field("type") String type);

    /***********************************************************************************************
     ************************************    USER    ***********************************************
     * ********************************************************************************************/

    /**
     * 用户注册
     *
     * @param mobile
     * @param email
     * @param password
     * @param code
     * @return
     */
    @POST("/users")
    @FormUrlEncoded
    Observable<BaseResultInfo> userRegister(@Field("mobile") String mobile,
                                            @Field("email") String email,
                                            @Field("password") String password,
                                            @Field("code") String code);

    /**
     * 用户资料修改--性别
     *
     * @Path("gender") String gender,
     */
    @FormUrlEncoded
    @PUT("/users/profile")
    Observable<BaseResultDataInfo<LedimUserBean>> modifyProfileGender(
            @Field("gender") String gender);

    /**
     * 用户头像修改
     */
    @POST("/users/avatar")
    @Multipart
    Observable<BaseResultDataInfo<LedimUserBean>> modifyAvatar(
            @Part("avatar\"; " + "filename=\"avatar" + ".jpg") RequestBody photo);

    /**
     * 用户资料修改--名称
     *
     * @Path("gender") String gender,
     */
    @FormUrlEncoded
    @PUT("/users/profile")
    Observable<BaseResultDataInfo<LedimUserBean>> modifyProfileName(
            @Field("nickname") String nickname);



    /**
     * 微信授权登录
     *
     * @param appid
     * @param secret
     * @param code
     * @param grant_type
     * @return
     */
    @GET("https://api.weixin.qq.com/sns/oauth2/access_token?")
    Observable<WeixinResponse> weixinLogin(@Query("appid") String appid,
                                           @Query("secret") String secret,
                                           @Query("code") String code,
                                           @Query("grant_type") String grant_type);

    /**
     * 用户注销
     */
    @POST("/logout")
    Observable<BaseResultInfo> logout();

    /**
     * 找回密码
     */
    @POST("/reset-password")
    @FormUrlEncoded
    Observable<BaseResultInfo> findPassword(@Field("email") String email);

    /**
     * 获取手机验证码
     *
     * @param mobile
     * @return
     */
    @POST("/verification-codes")
    @FormUrlEncoded
    Observable<BaseResultInfo> getCode(@Field("mobile") String mobile);

    /**
     * 第三方登录
     *
     * @param platform
     * @param auth_token
     * @param user_id
     * @return
     */
    @POST("/auth-login")
    @FormUrlEncoded
    Observable<LoginResponseBean> authLogin(@Field("platform") int platform,
                                            @Field("auth_token") String auth_token,
                                            @Field("user_id") String user_id);
    

    /**
     * 通过id查找用户信息 用于用户个人中心
     *
     * @param userId
     * @return
     */
    @GET("/users/info/{id}")
    Observable<BaseResultDataInfo<ChatRoomBean>> getUserInfoFromId(@Path("id") String userId);

    /**
     * @param loginname
     *         用户姓名
     * @param password
     *         用户密码
     * @param devid
     *         设备id
     * @param lon
     *         经度
     * @param lat
     *         纬度
     * @return 用户登录的返回信息
     */
    @POST("/login")
    @FormUrlEncoded
    Observable<LoginResponseBean> userLogin(@Field("loginname") String loginname,
                                            @Field("password") String password,
                                            @Field("devid") String devid, @Field("lon") String lon,
                                            @Field("lat") String lat);

    /**
     * 获取用户信息
     *
     * @return
     */
    @GET("/users/me")
    Observable<BaseResultDataInfo<LedimUserBean>> getUserInfo();

    /**
     * 用户签到接口
     *
     * @return
     */
    @GET("/users/sign")
    Observable<BaseResultDataInfo<UserSignDataBean>> userSign();

    /**
     * 金币细节
     *
     * @return
     */
    @GET("/users/coinDetail")
    Observable<BaseListResponse<CoinDetailBean>> getCoinDetail();

    @GET("/users/userlist")
    Observable<BaseResultDataInfo<LedimWatchUserResponse>> getWatchUsers(
            @Query("roomid") String roomid, @Query("num") int num, @Query("count") int count);

    /**
     * 通过用户id获取粉丝或者关注列表接口
     *
     * @param uid
     * @param relation
     * @param page
     * @param per_page
     * @param version
     * @return relation ：1 关注，2 粉丝
     */
    @GET("/follow/fans/{uid}")
    Observable<BaseListResponse<FanDataBean>> getFansListDatas(@Path("uid") String uid,
                                                               @Query("relation") String relation,
                                                               @Query("page") int page,
                                                               @Query("per_page") int per_page,
                                                               @Query("version") String version);

    /***********************************************************************************************
     ************************************    OTHER   ***********************************************
     **********************************************************************************************/

    /**
     * 根据版本号获取表情包接口
     *
     * @return
     */
    @GET("/lookpackage/index")
    Observable<BaseListResponse<ExpressionPackageBean>> getExpressionPackage(
            @Query("version") String version);

    /**
     * 通过package_id获取表情包里面的表情
     *
     * @re
     */
    @GET("/look")
    Observable<BaseListResponse<ExpressionPackageBean>> getExpressionFromPackageId(
            @Query("package_id") String package_id);

    /**
     * 获取精选页列表数据(即首页第一个table)
     *
     * @return
     */
    @GET("/groups")
    Observable<LedimGroupsCardReponse> getChoicePageGroups(@Query("page") int pageIndex,
                                                           @Query("per_page") int per_page,
                                                           @Query("version") String version);

    /**
     * 通过卡片组id获取卡片列表
     *
     * @return
     */
    @GET("cards/{group_id}")
    Observable<BaseListResponse<LedimChoiceCardBean>> getCardsByGroupId(
            @Path("group_id") String groupId, @Query("page") int pageIndex,
            @Query("per_page") int per_page);

    /**
     * 获取启动图片url
     *
     * @return
     */
    @GET("/startup")
    Observable<BaseResultDataInfo<LaunchImageUrlBean>> getLaunchImageUrl();

    /**
     * 提交反馈
     *
     * @param type
     * @param content
     * @param contact
     * @return
     */
    @FormUrlEncoded
    @POST("/feedback/add")
    Observable<BaseResultInfo> subminFeedback(@Field("type") String type,
                                              @Field("content") String content,
                                              @Field("contact") String contact);

    /**
     * 获取push消息列表
     *
     * @param page
     * @param per_page
     * @return
     */
    @GET("/push/list")
    Observable<BaseListResponse<LedimPushBean>> getPushMsgList(@Query("page") int page,
                                                               @Query("per_page") int per_page);

    /**
     * 获取我的投稿列表
     *
     * @param uid
     * @param page
     * @param per_page
     * @return
     */
    @GET("/contribute/list")
    Observable<BaseListResponse<ContributeListBean>> getContributeList(@Query("uid") int uid,
                                                                       @Query("page") int page,
                                                                       @Query("per_page")
                                                                               int per_page);

}
